██████╗ ███████╗████████╗██╗██████╗ ███████╗██████╗ ██╗ █████╗
██╔══██╗██╔════╝╚══██╔══╝██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗
██████╔╝█████╗ ██║ ██║██████╔╝█████╗ ██║ ██║██║███████║
██╔══██╗██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██║ ██║██║██╔══██║
██║ ██║███████╗ ██║ ██║██║ ███████╗██████╔╝██║██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
COMEFROM
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Nei mwawlinguaggi di programmazione, mwbaCOMEFROM (o mwbqCOME FROM) è una oscura mwbgstruttura di controllo usata in alcuni mwbwlinguaggi di programmazione, originariamente pensata come uno scherzo.
mwcqCOMEFROM è a grandi linee l'opposto di mwcgmwcwGOTO in quanto può acquisire lo stato di esecuzione da un punto arbitrario del codice verso una istruzione mwdaCOMEFROM. Il punto del codice dal quale lo stato attivo viene trasferito è usualmente passato come mwdqparametro di mwdgCOMEFROM. Il fatto che il trasferimento avvenga prima o dopo l'istruzione indicata al punto di origine dipende dal linguaggio utilizzato. Sempre dipendente dal linguaggio, la possibilità di riferire più istruzioni mwdwCOMEFROM alla stessa origine nel codice può risultare non valida, essere non deterministica, richiamare i vari punti del codice in sequenza o avviare processi in mweaparallelo o mweqconcorrente.
Un semplice esempio di istruzione "mwewCOMEFROM x" prevede l'utilizzo di un'mwfaetichetta, posizionata in un punto del codice altro rispetto al relativo mwfqCOMEFROM, che agisce come una sorta di "trappola". Quando l'esecuzione del codice raggiunge l'etichetta, l'esecuzione si trasferisce all'istruzione successiva al mwfgCOMEFROM. L'effetto principale è di rendere il debugging (e la compressione del flusso del software) estremamente difficile, dato che non c'è alcuna indicazione in prossimità dell'etichetta che l'esecuzione misteriosamente possa saltare da un'altra parte del programma.
Contents
• Storia
• Esempi
• Note
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Storia
mwggCOMEFROM è stato inizialmente visto in una lista di scherzi in diverse istruzioni mwgwassembly (come 'CMFRM'). È stato analizzato in un articolo pubblicato su Datamation da R. Lawrence Clark nel 1973,cite-ref-1[1] scritto in risposta alla lettera di mwigEdsger Dijkstra mwiwGo To Statement Considered Harmful. COMEFROM è stata implementata nella variante C-INTERCAL del mwjqLinguaggio di programmazione esoterico mwjgINTERCAL insieme al più misterioso 'mwjwCOMEFROM'.
Il 1º aprile 2004, Richie Hindle ha pubblicato un'implementazione delle istruzioni mwkgGOTO e mwkwCOMEFROM per mwlaPython.cite-ref-2[2] Nonostante sia stato distribuito come mwmqpesce d'aprile e non pensato per un utilizzo reale, la sintassi è valida e l'implementazione è completamente funzionante.
Usi pratici
Seppure mwnaCOMEFROM è sintatticamente e semanticamente un comando valido, e potenzialmente in grado di rimpiazzare mwnqGOTO in alcuni programmi, è molto più difficile gestirlo in fase di progettazione e di sviluppo in un linguaggio di programmazione. L'utilizzo più diffuso di costrutti simili a mwngCOMEFROM è l'impostazione di mwnwbreakpoint in fase di mwoadebug. Un'implementazione del mwoqFORTRAN ha previsto l'istruzione mwogCOMEFROM, con il nome di "mwowAT", come aiuto al debug, con evidenti avvisi che ne sconsigliavano l'utilizzo in codice di produzione. In più, molte moderne mwpaCPU hanno un supporto hardware per i breakpoint.
Alcuni elementi di mwpgProgrammazione orientata agli aspetti sono stati paragonati alle istruzioni mwpwCOMEFROM.cite-ref-3[3]
Nei compilatori che usano SSA, un nodo phi è sostanzialmente simile ad un comando mwrgCOMEFROM. Elenca da quali basic block l'attuale basic block avrebbe potuto essere raggiunto e il valore associato da usare per farlo.
Esempi
Il codice di seguito è un esempio di programma in un ipotetico dialetto mwswBASIC con l'utilizzo di "mwtaCOMEFROM" al posto di "mwtqGOTO".
10 COMEFROM 40
20 INPUT "WHAT IS YOUR NAME? "; A$
30 PRINT "HELLO, "; A$
40 REM
Il programma ipoteticamente richiede all'utente il suo nome per poi salutarlo, e ripetere l'operazione all'infinito. L'istruzione "mwagREM" alla linea 40 è semplicemente un comando di tipo mwawNOP — l'istruzione "mwbaCOMEFROM" alla linea 10 richiama l'esecuzione di quella riga quando viene raggiunta la linea 40, indipendentemente dal suo contenuto.
Un divertente esempio eseguibile in Python con il modulo/scherzo mwbgmwbwgoto installato (che usa il debugger per controllare l'esecuzione del programma) risulterebbe così:
from goto import comefrom, label
comefrom .repeat
name = raw_input('what is your name? ')
if name:
print "Hello",name
label .repeat
print "Goodbye!"
Questa è un'implementazione in mwkqRuby dell'istruzione COME FROM in Interical.
$come_from_labels = {}
def label(l)
if $come_from_labels[l]
$come_from_labels[l].call
end
end
def come_from(l)
callcc do |block|
$come_from_labels[l] = block
end
end
Alcuni esempio delle funzionalità di debug del compilatore Fortran OS/360:cite-ref-4[4]
Example 1:
INTEGER SOLON, GFAR, EWELL
.
.
.
10 SOLON = GFAR * SQRT(FLOAT(EWELL))
11 IF (SOLON) 40, 50, 60
.
.
.
DEBUG UNIT(3)
AT 11
DISPLAY GFAR, SOLON, EWELL
END
Example 2:
DIMENSION STOCK(1000),OUT(1000)
.
.
.
DO 30 I=1, 1000
25 STOCK(I)=STOCK(I) - OUT(I)
30 CONTINUE
35 A = B + C
.
.
.
DEBUG UNIT(3)
AT 35
DISPLAY STOCK
END
Example 3:
10 A = 1.5
12 L = 1
15 B = A + 1.5
20 DO 22 I = 1,5
.
.
.
22 CONTINUE
25 C = B + 3.16
30 D = C/2
STOP
.
.
.
DEBUG UNIT(3), TRACE
C DEBUG PACKET NUMBER 1
AT 10
TRACE ON
C DEBUG PACKET NUMBER 2
AT 20
TRACE OFF
DO 35 I = 1,3
.
.
.
35 CONTINUE
TRACE ON
C DEBUG PACKET NUMBER 3
AT 30
TRACE OFF
END
Nell'esempio 1, i valori di SOLON, GFAR, ed EWELL sono esaminati dopo il completamente dell'istruzione 10. L'istruzione AT rinvia alla riga 11.
Nell'esempio 2, tutti i valori di STOCK sono visualizzati quando viene eseguita la riga 35.
Nell'esempio 3, il TRACE viene eseguito dalla riga 10 alla riga 20. Il tracing viene interrotto durante l'esecuzione del loop e riattivato successivamente. Il tracing viene interrotto definitivamente durante l'esecuzione dell'istruzione alla riga 30.
Implementazioni hardware
LCNTR=42;
DO x UNTIL LCE; /* COMEFROM x, unless the loop counter is zero */
F12=F0*F4, F8=F8+F12, F0=dm(I0,M3), F4=pm(I8,M9);
IF NZ dm(I2,M2) = F12;
IF ZF dm(I2,M2) = F1;
x: R2 = R3 + 76; /* the label "x" does not exist in the machine code */
È da notare che la condizione per il termine del loop, qui indicata come mwaiyLCE (loop counter expired), può essere impostata su altri valori, incluso sempre vero o sempre falsa. Con una condizione sempre vera, si realizza nella pratica un'istruzione di tipo mwaicCOMEFROM. L'hardware supporta fino a sei mwaigCOMEFROM attivi simultaneamente.
Note
cite-note-11. ↑ mwai8Lawrence Clarke, mwajemwajiDatamation (article), Fortran. mwajmURL consultato il 10 luglio 2012 mwajq(archiviato dall'mwajuurl originale il 16 luglio 2018)..
cite-note-22. ↑ mwajkRichie Hindle, mwajomwajsgoto for Python, in mwajwEntrian, 1º aprile 2004..
cite-note-33. ↑ mwakaC2:ComeFrom
cite-note-44. ↑ IBM System/360 and System/370 Fortran IV Language, GC28-6515-10, May 1974
Bibliografia
• F. X. Reid, mwakcmwakgOn the Formal Semantics of the COMEFROM Statement, mwakkFACS FACTS, Issue 2006-1, pag. 18–20, marzo 2006
Voci correlate
Collegamenti esterni
• citereffoldoc(EN) Denis Howe, COME FROM, in Free On-line Dictionary of Computing. Disponibile con licenza mwalmGFDL
• mwaluCOMEFROM Information Page, su c2.com.
• mwalcDatamation Article, su fortran.com. URL consultato il 10 luglio 2012 (archiviato dall'url originale il 16 luglio 2018).
• mwalkJoke Assembler Instruction List Including CMFRM, su homepage.ntlworld.com. URL consultato il 10 luglio 2012 (archiviato dall'url originale il 22 ottobre 2012).
• mwalscomefrom support for Perl, su search.cpan.org.